﻿using System;
using Vallejos.Entidades.Enums;
using Vallejos.Entidades.Interfaces;
using Vallejos.Entidades.ModeloDeDatos;
using Vallejos.Negocio.proxiRiesgos;


namespace Vallejos.Negocio
{
    public class CreditScoringBLL : ICreditScoring
    {
        public SolicitudDeAnalisisCrediticio AnalizarSolicitud(SolicitudDeAnalisisCrediticio solicitud)
        {
            IService service = null;

            solicitud.InformacionDeRiesgo = ObtenerInformacionDeRiesgo(solicitud.Beneficiario.DatosPersonales.CUIL);

            solicitud.Estado = CalcularSituacionDelCliente(solicitud);

            return solicitud;
        }

        private EstadoDeAnalisis CalcularSituacionDelCliente(SolicitudDeAnalisisCrediticio solicitud)
        {
            var resultado = 0;
            var estado = new EstadoDeAnalisis();

            var informacion = solicitud.InformacionDeRiesgo;

            if(informacion.AntiguedadLaboral < 2)
                resultado += 6;
            else if (informacion.AntiguedadLaboral >= 2 && informacion.AntiguedadLaboral < 3)
                resultado += 15;
            else if (informacion.AntiguedadLaboral >= 3 && informacion.AntiguedadLaboral < 6)
                resultado += 21;
            else if (informacion.AntiguedadLaboral >= 6 && informacion.AntiguedadLaboral < 12)
                resultado += 26;
            else if (informacion.AntiguedadLaboral >= 12)
                resultado += 30;

            if(informacion.EdadOrig < 22)
                resultado += 3;
            else if (informacion.EdadOrig >= 22 && informacion.EdadOrig < 23)
                resultado += 4;
            else if (informacion.EdadOrig >= 23 && informacion.EdadOrig < 29)
                resultado += 9;
            else if (informacion.EdadOrig >= 29 && informacion.EdadOrig < 40)
                resultado += 15;
            else if (informacion.EdadOrig >= 40 && informacion.EdadOrig < 46)
                resultado += 19;
            else if (informacion.EdadOrig >= 46)
                resultado += 24;

            if (informacion.IngresosIS < 2500)
                resultado += 7;
            else if (informacion.IngresosIS >= 2500 && informacion.IngresosIS < 3050)
                resultado += 12;
            else if (informacion.IngresosIS >= 3050 && informacion.IngresosIS < 4150)
                resultado += 17;
            else if (informacion.IngresosIS >= 4150 && informacion.IngresosIS < 5160)
                resultado += 21;
            else if (informacion.IngresosIS >= 5160)
                resultado += 24;

            switch ((Profesion)informacion.Profesion)
            {
                case Profesion.Seguridad:
                case Profesion.Obrero:
                case Profesion.Vendedor:
                    resultado += 9;
                    break;
                case Profesion.Otra:
                case Profesion.ObreroCalificado:
                    resultado += 12;
                    break;
                case Profesion.Administrativo:
                    resultado += 16;
                    break;
                case Profesion.Encargado:
                case Profesion.Comerciante:
                case Profesion.Empresario:
                    resultado += 21;
                    break;
                case Profesion.Profesional:
                case Profesion.Tecnico:
                case Profesion.Docente:
                case Profesion.MandoIntermedio:
                    resultado += 27;
                    break;
                default:
                    resultado += 0;
                    break;
            }

            if (informacion.X_PS)
                resultado += 21;
            else
                resultado += 8;

            if(solicitud.Monto < 20000)
                resultado += 24;
            else if (solicitud.Monto >= 20000 && solicitud.Monto < 50000)
                resultado += 19;
            else if (solicitud.Monto >= 50000 && solicitud.Monto < 80000)
                resultado += 15;
            else if (solicitud.Monto >= 80000)
                resultado += 9;

            if (solicitud.CantidadDeCuotas < 24)
                resultado += 17;
            else if (solicitud.CantidadDeCuotas >= 24 && solicitud.Monto < 48)
                resultado += 13;
            else if (solicitud.CantidadDeCuotas >= 48)
                resultado += 12;

            estado.idEstado = resultado >= 60 ? IdEstadoAnalisis.PreAprobada : IdEstadoAnalisis.Rechazada;


            return estado;
        }

        private RiesgoCrediticio ObtenerInformacionDeRiesgo(String CUIL)
        {
            var rnd = new Random();

            var riesgo = new RiesgoCrediticio
            {
                AntiguedadLaboral = rnd.Next(0, 30),
                EdadOrig = rnd.Next(18, 65),
                IngresosIS = rnd.Next(2000, 6000),
                Profesion = rnd.Next(1, 13),
                X_PS = Convert.ToBoolean(rnd.Next(0, 1))
            };

            return riesgo;
        }
    }
}
